diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2012-01-06 01:08:53 -0700 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2012-01-06 01:08:53 -0700 |
| commit | 46ccdb146476f8ac140af75ab2decccbce800db2 (patch) | |
| tree | 7349b40681db46b38998096d26b7ddb74fe14072 | |
| parent | 3af6cc33ff246d31513b9a645403a9ece58983a0 (diff) | |
| download | stage-46ccdb146476f8ac140af75ab2decccbce800db2.tar.gz stage-46ccdb146476f8ac140af75ab2decccbce800db2.tar.bz2 stage-46ccdb146476f8ac140af75ab2decccbce800db2.tar.xz stage-46ccdb146476f8ac140af75ab2decccbce800db2.zip | |
smlToConsole is now non-recursive.
It's a lot better this way overall, it's one self-contained function, it
doesn't require as much setup, and it works wonderfully overall.
| -rw-r--r-- | src/options.cpp | 233 |
1 files changed, 140 insertions, 93 deletions
diff --git a/src/options.cpp b/src/options.cpp index 0f84e1c..319532e 100644 --- a/src/options.cpp +++ b/src/options.cpp | |||
| @@ -118,129 +118,176 @@ void smlToHtml( const SmlNode *pNode ) | |||
| 118 | } | 118 | } |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | void appendToken( Bu::String &sCurLine, Bu::String &sNextToken, int &iLineLen ) | 121 | void appendToken( Bu::String &sCurLine, Bu::String &sNextToken, int &iLineLen, |
| 122 | int &iNextLen ) | ||
| 122 | { | 123 | { |
| 123 | if( iLineLen + sNextToken.getSize() + 1 >= 78 ) | 124 | if( iLineLen + iNextLen + 1 >= 78 ) |
| 124 | { | 125 | { |
| 125 | sio << sCurLine << sio.nl; | 126 | sio << sCurLine << sio.nl; |
| 126 | iLineLen = 0; | 127 | iLineLen = 0; |
| 127 | sCurLine = sNextToken; | 128 | sCurLine = sNextToken; |
| 128 | |||
| 129 | } | 129 | } |
| 130 | else | 130 | else |
| 131 | { | 131 | { |
| 132 | sCurLine += sNextToken; | 132 | sCurLine += sNextToken; |
| 133 | } | 133 | } |
| 134 | iLineLen += sNextToken.getSize() + 1; | 134 | iLineLen += iNextLen + 1; |
| 135 | sCurLine += " "; | 135 | sCurLine += " "; |
| 136 | iNextLen = 0; | ||
| 136 | sNextToken.clear(); | 137 | sNextToken.clear(); |
| 137 | } | 138 | } |
| 138 | 139 | ||
| 139 | void smlToConsole( const SmlNode *pNode, Bu::String &sCurLine, | 140 | void smlToConsole( const SmlNode *pNode ) |
| 140 | Bu::String &sNextToken, int &iLineLen, int &iState ) | ||
| 141 | { | 141 | { |
| 142 | // sio << "Begin: iState = " << iState << sio.nl; | 142 | Bu::String sCurLine; |
| 143 | switch( pNode->getType() ) | 143 | Bu::String sNextToken; |
| 144 | int iLineLen = 0; | ||
| 145 | int iNextLen = 0; | ||
| 146 | int iState = 0; | ||
| 147 | typedef Bu::List<SmlNode::SmlNodeList::const_iterator> NodeStack; | ||
| 148 | NodeStack sNode; | ||
| 149 | |||
| 150 | sNode.push( pNode->getChildren().begin() ); | ||
| 151 | |||
| 152 | for(;;) | ||
| 144 | { | 153 | { |
| 145 | case SmlNode::typeRoot: | 154 | if( !sNode.peek() ) |
| 146 | for( SmlNode::SmlNodeList::const_iterator i = | 155 | { |
| 147 | pNode->getChildren().begin(); i; i++ ) | 156 | sNode.pop(); |
| 157 | if( sNode.isEmpty() ) | ||
| 158 | break; | ||
| 159 | if( sNode.peek() ) | ||
| 148 | { | 160 | { |
| 149 | smlToConsole( *i, sCurLine, sNextToken, iLineLen, iState ); | 161 | // sio << "Pop'd: " << (*sNode.peek())->getText() << sio.nl; |
| 162 | Bu::String sTag = (*sNode.peek())->getText(); | ||
| 163 | if( sTag == "green" || sTag == "red" ) | ||
| 164 | { | ||
| 165 | sNextToken += "\x1B[0m"; | ||
| 166 | } | ||
| 167 | sNode.peek()++; | ||
| 168 | continue; | ||
| 150 | } | 169 | } |
| 170 | } | ||
| 171 | if( sNode.isEmpty() ) | ||
| 172 | { | ||
| 151 | break; | 173 | break; |
| 152 | 174 | } | |
| 153 | case SmlNode::typeText: | 175 | const SmlNode *pNode = (*sNode.peek()); |
| 154 | { | 176 | switch( pNode->getType() ) |
| 155 | Bu::String::const_iterator iBgn = pNode->getText().begin(); | 177 | { |
| 156 | Bu::String::const_iterator iEnd = iBgn; | 178 | case SmlNode::typeRoot: |
| 157 | for(;iBgn;) | 179 | throw Bu::ExceptionBase("Invalid root."); |
| 180 | |||
| 181 | case SmlNode::typeText: | ||
| 158 | { | 182 | { |
| 159 | // sio << iState << ": [" << (iBgn?*iBgn:'-') << ":" | 183 | // sio << "Process text node: " << pNode->getText() << |
| 160 | // << (iEnd?*iEnd:'-') << "]" | 184 | // sio.nl; |
| 161 | // << sio.nl; | 185 | Bu::String::const_iterator iBgn = pNode->getText().begin(); |
| 186 | Bu::String::const_iterator iEnd = iBgn; | ||
| 162 | int iTmpLen = 0; | 187 | int iTmpLen = 0; |
| 163 | switch( iState ) | 188 | for(;iBgn;) |
| 164 | { | 189 | { |
| 165 | case 0: // begining of paragraph | 190 | switch( iState ) |
| 166 | if( iBgn && ( *iBgn == ' ' || *iBgn == '\n' || | 191 | { |
| 167 | *iBgn == '\r' || *iBgn == '\t' ) ) | 192 | case 0: // begining of paragraph |
| 168 | { | 193 | if( iBgn && ( *iBgn == ' ' || *iBgn == '\n' || |
| 169 | iBgn++; | 194 | *iBgn == '\r' || *iBgn == '\t' ) ) |
| 170 | } | 195 | { |
| 171 | else | 196 | iBgn++; |
| 172 | { | 197 | } |
| 173 | // Here is where you would indent paragraphs | 198 | else |
| 174 | iEnd = iBgn; | 199 | { |
| 175 | iState = 1; | 200 | // Here is where you would indent paragraphs |
| 176 | } | 201 | iEnd = iBgn; |
| 177 | break; | 202 | iState = 1; |
| 178 | 203 | } | |
| 179 | case 1: // non-whitespace | 204 | break; |
| 180 | if( !iEnd ) | 205 | |
| 181 | { | 206 | case 1: // non-whitespace |
| 182 | sNextToken.append( iBgn, iEnd ); | 207 | if( !iEnd ) |
| 183 | iBgn = iEnd; | 208 | { |
| 184 | } | 209 | sNextToken.append( iBgn, iEnd ); |
| 185 | else if( *iEnd == ' ' || *iEnd == '\n' || | 210 | iBgn = iEnd; |
| 186 | *iEnd == '\r' || *iEnd == '\t' ) | 211 | } |
| 187 | { | 212 | else if( *iEnd == ' ' || *iEnd == '\n' || |
| 188 | sNextToken.append( iBgn, iEnd ); | 213 | *iEnd == '\r' || *iEnd == '\t' ) |
| 189 | iState = 2; | 214 | { |
| 190 | iBgn = iEnd; | 215 | sNextToken.append( iBgn, iEnd ); |
| 191 | } | 216 | iNextLen += iTmpLen; |
| 192 | else | 217 | iTmpLen = 0; |
| 193 | { | 218 | iState = 2; |
| 194 | iEnd++; | 219 | iBgn = iEnd; |
| 195 | iTmpLen++; | 220 | } |
| 196 | } | 221 | else |
| 197 | break; | 222 | { |
| 198 | 223 | iEnd++; | |
| 199 | case 2: // Whitespace | 224 | iTmpLen++; |
| 200 | if( iBgn && (*iBgn == ' ' || *iBgn == '\n' || | 225 | } |
| 201 | *iBgn == '\r' || *iBgn == '\t') ) | 226 | break; |
| 202 | { | 227 | |
| 203 | iBgn++; | 228 | case 2: // Whitespace |
| 204 | } | 229 | if( iBgn && (*iBgn == ' ' || *iBgn == '\n' || |
| 205 | else | 230 | *iBgn == '\r' || *iBgn == '\t') ) |
| 206 | { | 231 | { |
| 207 | iEnd = iBgn; | 232 | iBgn++; |
| 208 | iState = 1; | 233 | } |
| 209 | appendToken( sCurLine, sNextToken, iLineLen ); | 234 | else |
| 210 | } | 235 | { |
| 211 | break; | 236 | iEnd = iBgn; |
| 237 | iState = 1; | ||
| 238 | appendToken( sCurLine, sNextToken, | ||
| 239 | iLineLen, iNextLen ); | ||
| 240 | } | ||
| 241 | break; | ||
| 242 | } | ||
| 212 | } | 243 | } |
| 213 | } | 244 | } |
| 214 | } | 245 | break; |
| 215 | break; | ||
| 216 | 246 | ||
| 217 | case SmlNode::typeTag: | 247 | case SmlNode::typeTag: |
| 218 | if( pNode->getChildren().isEmpty() ) | 248 | if( pNode->getChildren().isEmpty() ) |
| 219 | { | ||
| 220 | if( pNode->getText() == "break" ) | ||
| 221 | { | 249 | { |
| 222 | appendToken( sCurLine, sNextToken, iLineLen ); | 250 | if( pNode->getText() == "break" ) |
| 223 | if( !sCurLine.isEmpty() ) | 251 | { |
| 224 | sio << sCurLine << sio.nl; | 252 | appendToken( sCurLine, sNextToken, iLineLen, iNextLen ); |
| 225 | sCurLine.clear(); | 253 | if( !sCurLine.isEmpty() ) |
| 226 | iLineLen = 0; | 254 | sio << sCurLine << sio.nl; |
| 227 | iState = 0; | 255 | sCurLine.clear(); |
| 256 | iLineLen = 0; | ||
| 257 | iState = 0; | ||
| 258 | } | ||
| 228 | } | 259 | } |
| 229 | } | 260 | else |
| 230 | else | ||
| 231 | { | ||
| 232 | for( SmlNode::SmlNodeList::const_iterator i = | ||
| 233 | pNode->getChildren().begin(); i; i++ ) | ||
| 234 | { | 261 | { |
| 235 | smlToConsole( *i, sCurLine, sNextToken, iLineLen, iState ); | 262 | // sio << "Push'd: " << pNode->getText() << sio.nl; |
| 263 | Bu::String sTag = pNode->getText(); | ||
| 264 | if( sTag == "green" ) | ||
| 265 | { | ||
| 266 | sNextToken += "\x1B[1;32m"; | ||
| 267 | } | ||
| 268 | else if( sTag == "red" ) | ||
| 269 | { | ||
| 270 | sNextToken += "\x1B[1;31m"; | ||
| 271 | } | ||
| 272 | sNode.push( pNode->getChildren().begin() ); | ||
| 273 | continue; | ||
| 274 | /* for( SmlNode::SmlNodeList::const_iterator i = | ||
| 275 | pNode->getChildren().begin(); i; i++ ) | ||
| 276 | { | ||
| 277 | s | ||
| 278 | smlToConsole( *i, sCurLine, sNextToken, iLineLen, iState ); | ||
| 279 | } | ||
| 280 | */ | ||
| 236 | } | 281 | } |
| 237 | } | 282 | break; |
| 238 | break; | 283 | } |
| 284 | sNode.peek()++; | ||
| 239 | } | 285 | } |
| 240 | 286 | if( !sNextToken.isEmpty() ) | |
| 241 | // sio << "Green? \x1b[1mhello\x1b[0m huh" << sio.nl; | 287 | appendToken( sCurLine, sNextToken, iLineLen, iNextLen ); |
| 288 | sio << sCurLine << sio.nl; | ||
| 242 | } | 289 | } |
| 243 | 290 | /* | |
| 244 | void smlToConsole( const SmlNode *pNode ) | 291 | void smlToConsole( const SmlNode *pNode ) |
| 245 | { | 292 | { |
| 246 | Bu::String sBuf, sBuf2; | 293 | Bu::String sBuf, sBuf2; |
| @@ -248,7 +295,7 @@ void smlToConsole( const SmlNode *pNode ) | |||
| 248 | smlToConsole( pNode, sBuf, sBuf2, i1, i2 ); | 295 | smlToConsole( pNode, sBuf, sBuf2, i1, i2 ); |
| 249 | appendToken( sBuf, sBuf2, i1 ); | 296 | appendToken( sBuf, sBuf2, i1 ); |
| 250 | sio << sBuf << sBuf2 << sio.nl; | 297 | sio << sBuf << sBuf2 << sio.nl; |
| 251 | } | 298 | }*/ |
| 252 | 299 | ||
| 253 | int Options::smlTest( Bu::Array<Bu::String> aArgs ) | 300 | int Options::smlTest( Bu::Array<Bu::String> aArgs ) |
| 254 | { | 301 | { |
